function longestPalindrome(s) {
  const n = s.length;
  let maxLength = 1; // 最长回文子串的长度至少为1
  let start = 0; // 最长回文子串的起始位置

  // 创建一个二维数组来存储状态，dp[i][j] 表示 s[i:j] 是否是回文子串
  const dp = Array.from(Array(n), () => Array(n).fill(false));

  // 初始化，单个字符肯定是回文子串
  for (let i = 0; i < n; i++) {
    dp[i][i] = true;
  }

  // 从长度为2的子串开始遍历
  for (let len = 2; len <= n; len++) {
    for (let i = 0; i < n - len + 1; i++) {
      const j = i + len - 1; // 子串的结束位置

      // 当子串的首尾字符相同时，检查其内部是否是回文子串
      if (s[i] === s[j] && (len === 2 || dp[i + 1][j - 1])) {
        dp[i][j] = true;

        // 更新最长回文子串的信息
        if (len > maxLength) {
          maxLength = len;
          start = i;
        }
      }
    }
  }

  // 根据最长回文子串的起始位置和长度，截取出最长回文子串
  return s.substring(start, start + maxLength);
}

// 测试
const s = "babad";
console.log("最长回文子串为:", longestPalindrome(s)); // 输出: "bab" 或 "aba"
